package main

import (
	"net"
	"fmt"
	"strings"
)

func HandleConn(conn net.Conn)  {
	defer conn.Close()

	//获取客户端的网络地址信息
	addr := conn.RemoteAddr().String()

	/**
	这里使用for循环是为了让连接不断开，因为如果不加的话，这个函数走完发送数据的这一步，就去关闭连接了，就会导致程序退出
	 */
	for  {
		//读取用户数据
		buf := make([]byte, 2048)
		n, err := conn.Read(buf)
		if err != nil {
			fmt.Println(err)
			return
		}

		fmt.Printf("[%s]: %s, len(%d)\n", addr, string(buf[:n]), len(string(buf[:n])))

		//windows这里的接受值是带有一个换行字符和一个另起一行字符的(\r\n)，所以在判断用户输入的时候，要读取的长度是n-2
		//windows这里的接受值是带有一个换行字符和一个另起一行字符的(\n)，所以在判断用户输入的时候，要读取的长度是n-2
		if "exit" == string(buf[:n - 1]) {
			fmt.Println(addr, "exit")
			 return
		}
		//业务逻辑，转换大写
		conn.Write([]byte(strings.ToUpper(string(buf[:n]))))
	}
}

func main()  {
	listen, err := net.Listen("tcp", "127.0.0.1:8000")
	if err != nil {
		fmt.Println(err)
		return
	}

	defer listen.Close()

	//接受多个用户
	for {
		conn, err1 := listen.Accept()
		if err1 != nil {
			fmt.Println(err1)
			return
		}

		//处理用户发送的数据,每来一个请求开一个协程
		go HandleConn(conn)
	}
}
